home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2005 February / WN_129_CD.iso / Windows / Extensions Firefox / Bookmarks Synchronizer / bookmarksftp1_0_1.xpi / chrome / bookmarksftp.jar / content / bmsyncRDFService.js < prev    next >
Text File  |  2004-10-17  |  26KB  |  846 lines

  1. function BookmarksSynchronizerXBEL(){
  2.   this._init();
  3. }
  4.  
  5. BookmarksSynchronizerXBEL.prototype=
  6. {
  7.   settings:null,
  8.  
  9.   _tempDoc:null,
  10.   _rdfService  :  null,
  11.   _ds  :  null,
  12.   _tempc  :  null,
  13.   _rdfcu:null,
  14.  
  15.   get _pid(){
  16.     return "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML";
  17.   },
  18.  
  19.   get _sid(){
  20.     return "http://pyxml.sourceforge.net/topics/dtds/xbel-1.0.dtd";
  21.   },
  22.  
  23.   get _owner(){
  24.     return "Mozilla";
  25.   },
  26.  
  27.   _init:function()
  28.   {
  29.     this.settings=new BookmarksSynchronizerSettings();
  30.  
  31.     this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  32.                       .getService(Components.interfaces.nsIRDFService);
  33.  
  34.     this._ds=this._rdfService.GetDataSource( "rdf:bookmarks" );
  35.     this._ds.QueryInterface(Components.interfaces.nsIBookmarksService);
  36.     this._tempc = Components.classes["@mozilla.org/rdf/container;1"]
  37.                     .getService(Components.interfaces.nsIRDFContainer);
  38.     this._rdfcu = Components.classes['@mozilla.org/rdf/container-utils;1']
  39.                     .getService(Components.interfaces.nsIRDFContainerUtils);
  40.  
  41.     this._urlArc=this._rdfService.GetResource( "http://home.netscape.com/NC-rdf#URL");
  42.     this._nameArc=this._rdfService.GetResource( "http://home.netscape.com/NC-rdf#Name");
  43.     this._descArc=this._rdfService.GetResource("http://home.netscape.com/NC-rdf#Description");
  44.     this._typeArc=this._rdfService.GetResource("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
  45.     this._keywordArc= this._rdfService.GetResource("http://home.netscape.com/NC-rdf#ShortcutURL");
  46.     this._iconArc= this._rdfService.GetResource("http://home.netscape.com/NC-rdf#Icon");
  47.     this._typeArc=this._rdfService.GetResource("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
  48.     this._feedArc= this._rdfService.GetResource("http://home.netscape.com/NC-rdf#FeedURL");
  49.     this._sideArc= this._rdfService.GetResource("http://home.netscape.com/NC-rdf#WebPanel");
  50.     this._dateArc= this._rdfService.GetResource("http://home.netscape.com/NC-rdf#BookmarkAddDate");
  51.  
  52.     this._bookmarkVal=this._rdfService.GetResource("http://home.netscape.com/NC-rdf#Bookmark");
  53.     this._folderVal=this._rdfService.GetResource("http://home.netscape.com/NC-rdf#Folder");
  54.     this._livemarkVal=this._rdfService.GetResource("http://home.netscape.com/NC-rdf#Livemark");
  55.   },
  56.  
  57.   /* Bookmarks -> XBEL */
  58.  
  59.   _initXBELElement:function(resource)
  60.   {
  61.     var title=  this._getLiteral(resource,this._nameArc);
  62.     var desc= this._getLiteral(resource,this._descArc);
  63.  
  64.     if(title)
  65.       this._addTitle(this._tempDoc.documentElement,title);
  66.     if(desc)
  67.       this._addDesc(this._tempDoc.documentElement,desc);
  68.     if(! this._isBookmarkedResource(this._rdfToolbar,resource))
  69.       return;
  70.     this._addInfo(this._tempDoc.documentElement,[["BookmarksToolbarFolder",this._rdfToolbar.Value]]);
  71.   },
  72.  
  73.   get _rdfToolbar()
  74.   {
  75.       return this._ds.getBookmarksToolbarFolder();
  76.   },
  77.  
  78.   get _root(){
  79.     return this._rdfService.GetResource(this.settings.selectedFolder);
  80.   },
  81.  
  82.   _isBookmarkedResource:function(aResource,aRoot)
  83.   {
  84.     if(!aResource || !aRoot) return false;
  85.     try{
  86.       aResource.QueryInterface(Components.interfaces.nsIRDFResource);
  87.       aRoot.QueryInterface(Components.interfaces.nsIRDFResource);
  88.  
  89.     }catch(e){return false;}
  90.     var folders=[aRoot];
  91.     var uri=aResource.Value;
  92.     while(folders.length>0)
  93.     {
  94.       var folder=folders.shift();
  95.       this._tempc.Init(this._ds, folder);
  96.       var elements=this._tempc.GetElements();
  97.       while(elements.hasMoreElements())
  98.       {
  99.         var element=elements.getNext();
  100.         element.QueryInterface(Components.interfaces.nsIRDFResource);
  101.         if(element.EqualsString ( uri ))
  102.           return true;
  103.         else if(this._rdfcu.IsContainer(this._ds,element))
  104.           folders.push(element);
  105.       }
  106.     }
  107.     return false;
  108.   },
  109.  
  110.   get source()
  111.   {
  112.     var doctype=document.implementation
  113.                         .createDocumentType("xbel",this._pid,this._sid);
  114.     this._tempDoc=document.implementation
  115.                         .createDocument("","xbel",doctype);
  116.  
  117.     var serializer= new XMLSerializer();
  118.  
  119.     var enableLM=this.settings.getBool("livemark",true);
  120.     var enableKW=this.settings.getBool("keyword",true);
  121.     var enableFI=this.settings.getBool("favicon",true);
  122.     var enableWP=this.settings.getBool("webpanel",true);
  123.  
  124.     try{
  125.       if(!this._ds.isBookmarkedResource(this._root)||this._resolveType(this._root)!="Folder")
  126.         return "";
  127.     }catch(e){return "";}
  128.  
  129.     this._initXBELElement(this._root);
  130.     var foldersets=[[this._tempDoc.documentElement,this._root]];
  131.  
  132.     while(foldersets.length>0)
  133.     {
  134.       var folderset= foldersets.shift();
  135.       var folder=folderset[1].QueryInterface(Components.interfaces.nsIRDFResource);
  136.       this._tempc.Init(this._ds, folder);
  137.       var elements=this._tempc.GetElements();
  138.       while(elements.hasMoreElements())
  139.       {
  140.         var resource=elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  141.         var uri=resource.Value.replace(/\:/g,"%3A");
  142.         var name=this._getLiteral(resource,this._nameArc);
  143.         var desc=this._getLiteral(resource,this._descArc);
  144.         var url="";
  145.         var info=[];
  146.         switch (this._resolveType(resource)) {
  147.         case "BookmarkSeparator":
  148.           this._addSeparator(folderset[0]);
  149.           break;
  150.         case "IEFavorite":
  151.         case "ImmutableBookmark":
  152.         case "Bookmark":
  153.           url=this._getLiteral(resource,this._urlArc);
  154.           if(enableKW){
  155.             var keyword=this._getLiteral(resource,this._keywordArc);
  156.             if(keyword)
  157.               info.push(["ShortcutURL",keyword]);
  158.           }
  159.           if(enableFI){
  160.             var icon=this._getLiteral(resource,this._iconArc);
  161.             if(icon)
  162.               info.push(["Icon",icon]);
  163.           }
  164.           if(enableWP){
  165.             var sidebar=this._getLiteral(resource,this._sideArc);
  166.             if(sidebar)
  167.               info.push(["WebPanel",sidebar]);
  168.           }
  169.           this._addBookmark(folderset[0],uri,name,desc,url,info);
  170.           break;
  171.         case "Livemark":
  172.           url=this._getLiteral(resource,this._urlArc);
  173.           info=(enableLM)? [["FeedURL",this._getLiteral(resource,this._feedArc)]]:[];
  174.           this._addBookmark(folderset[0],uri,name,desc,url,info);
  175.           break;
  176.         case "Folder":
  177.         case "PersonalToolbarFolder":
  178.         case "IEFavoriteFolder":
  179.           var newFolder=this._addFolder(folderset[0],uri,name,desc);
  180.           foldersets.push([newFolder,resource]);
  181.           break;
  182.           break;
  183.         case "LivemarkBookmark":
  184.            break;
  185.         default:
  186.         }
  187.       }
  188.     }
  189.     return "<?xml version=\"1.0\" encoding=\""+this.settings.charset+"\"?>\n"
  190.           +  this.convertFromUnicode(this.settings.charset,
  191.           this.settings.tags + serializer.serializeToString(this._tempDoc));
  192.   },
  193.  
  194.   _resolveType: function (aResource)
  195.   {
  196.     var type = this._ds.GetTarget(aResource, this._typeArc, true);
  197.     if(type){
  198.       var uri=type.QueryInterface(Components.interfaces.nsIRDFResource).Value;
  199.       return uri.split("#")[1];
  200.     } else if(this._rdfcu.IsContainer(this._ds,aResource))
  201.         return "Folder";
  202.     else if (this._getLiteral(aResource, this._urlArc))
  203.       return "Bookmark";
  204.     return "";
  205.   },
  206.  
  207.   _getLiteral:function(resource,arc)
  208.   {
  209.     var target=this._ds.GetTarget(resource, arc, true);          
  210.     if(target) return target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  211.     else return "";
  212.   },
  213.  
  214.   _addTitle:function(element,str)
  215.   {
  216.     var title=this._tempDoc.createElement("title");
  217.     var textnode=this._tempDoc.createTextNode(str);
  218.     title.appendChild(textnode);
  219.     element.appendChild(title);
  220.   },
  221.  
  222.   _addInfo:function(aElement , aData)
  223.   {
  224.     if(aData.length==0)
  225.       return;
  226.     var info=this._tempDoc.createElement("info");
  227.     var  metadata=this._tempDoc.createElement("metadata");
  228.     metadata.setAttribute("owner", this._owner);
  229.  
  230.     while(aData.length >0)
  231.     {
  232.       var temp=aData.shift();
  233.       metadata.setAttribute(temp[0], temp[1]);
  234.     }
  235.     info.appendChild(metadata);
  236.     aElement.appendChild(info);
  237.   },
  238.  
  239.   _addDesc:function(element,str)
  240.   {
  241.     var title=this._tempDoc.createElement("desc");
  242.     var textnode=this._tempDoc.createTextNode(str);
  243.     title.appendChild(textnode);
  244.     element.appendChild(title);
  245.   },
  246.  
  247.   _addBookmark:function(element,uri,title,desc,url,info)
  248.   {
  249.     var bookmark=this._tempDoc.createElement("bookmark");
  250.     bookmark.setAttribute("id",uri);
  251.     bookmark.setAttribute("href",url);
  252.     this._addTitle(bookmark,title);
  253.     if(info.length>0)
  254.       this._addInfo(bookmark,info);
  255.     if(desc)
  256.       this._addDesc(bookmark,desc);
  257.     element.appendChild(bookmark);
  258.   },
  259.  
  260.   _addFolder:function(element,uri,title,desc)
  261.   {
  262.     var folder=this._tempDoc.createElement("folder");
  263.     folder.setAttribute("id",uri);
  264.     this._addTitle(folder,title);
  265.     if(desc)
  266.       this._addDesc(folder,desc);
  267.     element.appendChild(folder);
  268.     return folder;
  269.   },
  270.  
  271.   _addSeparator:function(element)
  272.   {
  273.     var sep=this._tempDoc.createElement("separator");
  274.     element.appendChild(sep);
  275.   },
  276.  
  277.   convertFromUnicode:function(aCharset, aSrc )
  278.   {
  279.     try{
  280.         var unicodeConverter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
  281.                   .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  282.         unicodeConverter.charset = aCharset;
  283.          return unicodeConverter.ConvertFromUnicode( aSrc );
  284.     }catch(e){alert(e);}
  285.     return aSrc;
  286.   },
  287.  
  288. /* XBEL -> Bookmarks */
  289.  
  290.   _icons:[],
  291.   _xbelToolbar:null,
  292.  
  293.   set source(aStr)
  294.   {
  295.     this._icons=[];
  296.     this._xbelToolbar=null;
  297.  
  298.     /* preprocess */
  299.     if(!this._setDocument(aStr))
  300.       throw "bmsync:noxbel";
  301.     if(!this._rdfcu.IsContainer(this._ds,this._root))
  302.       throw "bmsync:foldernotfound";
  303.  
  304.     this._xbelToolbar=this.__xbelToolbar;
  305.     if(  !this._xbelToolbar &&
  306.       this._isBookmarkedResource(this._rdfToolbar,this._root) && 
  307.       !confirm(this.settings.getString("losetoolbarfolder")))
  308.       throw "bmsync:usercancel";
  309.  
  310.     var failure=false;
  311.  
  312.     /* main process */
  313.     this._ds.beginUpdateBatch();
  314.     this._killBrowser();
  315.     try
  316.     {
  317.       if(this.settings.getBool("merge",false))
  318.         this._merge();
  319.       else
  320.       {
  321.         this._cleanup();
  322.         this._subprocess();
  323.       }
  324.     }catch(e){alert(e); failure=true;}
  325.  
  326.     try{
  327.       this._updateIcons();
  328.     }catch(e){}
  329.  
  330.     this._reliveBrowser();
  331.     this._ds.endUpdateBatch();
  332.     this._ds.transactionManager.clear();
  333.  
  334.     if(failure)
  335.       throw "bmsync:unexpected";
  336.   },
  337.  
  338.   _setDocument:function(aStr)
  339.   {
  340.     if(!aStr)
  341.       return false;
  342.     var parser=new DOMParser();
  343.     this._tempDoc= parser.parseFromString(this.convertToUnicode(aStr),"text/xml");
  344.     if(!this._isXBEL())
  345.       return false;
  346.     return true;
  347.   },
  348.  
  349.   _getBookmarkByName:function(aName)
  350.   {
  351.     if(!aName)
  352.       return null;
  353.     var elements=this._tempc.GetElements();
  354.     while(elements.hasMoreElements())
  355.     {
  356.       var element=elements.getNext()
  357.                        .QueryInterface(Components.interfaces.nsIRDFResource);
  358.       var type=this._resolveType(element);
  359.       if(type == "Bookmark" || type == "Livemark")
  360.       {
  361.         var target=this._ds.GetTarget(element,this._nameArc,true);
  362.         if(target && target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value == aName)
  363.           return element;
  364.       }
  365.     }
  366.     return null;
  367.   },
  368.  
  369.   _getFolderByName:function(aName)
  370.   {
  371.     var elements=this._tempc.GetElements();
  372.     while(elements.hasMoreElements())
  373.     {
  374.       var element=elements.getNext()
  375.                       .QueryInterface(Components.interfaces.nsIRDFResource);
  376.       if(this._resolveType(element) == "Folder")
  377.       {
  378.         var target=this._ds.GetTarget(element,this._nameArc,true);
  379.         if(target &&
  380.            target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value == aName)
  381.           return element;
  382.       }
  383.     }
  384.     return null;
  385.   },
  386.  
  387.   get _date()
  388.   {
  389.     var date= ((new Date()).getTime())*1000;
  390.     date=parseInt(date).toString();
  391.     return date;
  392.   },
  393.  
  394.   _changeBookmark: function (bookmark,data)
  395.   {
  396.     const trueVal=this._rdfService.GetLiteral("true");
  397.     /*0=id,1=name,2=url,3=keyword,4=desc,5=feedURL,6=webPanel*/
  398.  
  399.     var date=this._rdfService.GetDateLiteral(this._date);
  400.     this._assert(bookmark,this._dateArc,date);
  401.  
  402.     if(data[1])
  403.       this._assert(bookmark,this._nameArc,this._rdfService.GetLiteral(data[1]));
  404.     if(data[2])
  405.       this._assert(bookmark,this._urlArc,this._rdfService.GetLiteral(data[2]));
  406.     if(data[3])
  407.       this._assert(bookmark,this._keywordArc,this._rdfService.GetLiteral(data[3]));
  408.     if(data[4])
  409.       this._assert(bookmark,this._descArc,this._rdfService.GetLiteral(data[4]));
  410.     if(date[6])
  411.       this._assert(bookmark,this._sideArc,trueVal);
  412.   },
  413.  
  414.   _merge:function()
  415.   {
  416.     var foldersets=[[this._tempDoc.documentElement,this._root]];
  417.     var folderset=null;
  418.  
  419.     const trueVal=this._rdfService.GetLiteral("true");
  420.     while(foldersets.length > 0)
  421.     {
  422.       folderset=foldersets.shift();
  423.       var childNodes=folderset[0].childNodes;
  424.       var resource= folderset[1];
  425.       var title="";
  426.       var desc="";
  427.       var id="";
  428.       this._tempc.Init(this._ds, resource);
  429.       for(var i =0; i< childNodes.length; i++)
  430.       {
  431.         var element=childNodes[i];
  432.         if(element.nodeType==1)
  433.         {
  434.           id=this._getProp(element,"id");
  435.           var oldResource=null;
  436.           if(id)
  437.             oldResource=this._rdfService.GetResource(id);
  438.           var oldDataExists= ( oldResource && this._tempc.IndexOf(oldResource) > -1)
  439.  
  440.           switch(element.nodeName.toUpperCase())
  441.           {
  442.             case "BOOKMARK":
  443.               var bookmark;
  444.               var data=this._getBookmarkData(element);
  445.               if( oldDataExists )
  446.                 var bookmark=oldResource;
  447.               else
  448.               {
  449.                 bookmark=this._getBookmarkByName(data[1]);
  450.               }
  451.               if(!bookmark)
  452.                 bookmark=this._createBookmark(id,data[5]);
  453.               this._changeBookmark(bookmark,data);
  454.               break;
  455.             case "FOLDER":
  456.               title=this._getTitle(element);
  457.               desc=this._getDesc(element);
  458.               var folder=null;
  459.               if( oldDataExists )
  460.                 folder=oldResource;
  461.               else
  462.               {
  463.                 folder=this._getFolderByName(title);
  464.                 if(!folder)
  465.                   folder=this._ds.createFolderInContainer(title,resource,0);
  466.               }
  467.               if(desc)
  468.                 this._assert( folder,this._descArc,
  469.                               this._rdfService.GetLiteral(desc));
  470.               foldersets.push([element, folder]);
  471.               if(this._xbelToolbar && id==this._xbelToolbar)
  472.                 this._ds.setBookmarksToolbarFolder(folder);
  473.               break;
  474.             case "SEPARATOR":
  475.               break;
  476.           }
  477.         }
  478.       }
  479.     }
  480.   },
  481.  
  482.   _cleanup:function()
  483.   {
  484.     var folders=[this._root];
  485.     while(folders.length>0)
  486.     {
  487.       var folder= folders.shift();
  488.       folder.QueryInterface(Components.interfaces.nsIRDFResource);
  489.       this._tempc.Init(this._ds, folder);
  490.       var elements=this._tempc.GetElements();
  491.       while(elements.hasMoreElements())
  492.       {
  493.         var resource=elements.getNext();
  494.         this._tempc.RemoveElement(resource,false);
  495.         if(this._rdfcu.IsContainer(this._ds,resource))
  496.           folders.push(resource);
  497.         else this._unassert(resource);
  498.       }
  499.       if(folder.Value!=this._root.Value)
  500.           this._unassert(folder);
  501.     }
  502.   },
  503.  
  504.   _updateIcons:function()
  505.   {
  506.     const stringStream=Components.classes["@mozilla.org/io/string-input-stream;1"]
  507.                       .createInstance(Components.interfaces.nsIStringInputStream);
  508.     const binStream = Components.classes['@mozilla.org/binaryinputstream;1']
  509.                       .createInstance(Components.interfaces.nsIBinaryInputStream);
  510.  
  511.     while(this._icons.length>0)
  512.     {
  513.       var icon=this._icons.shift();
  514.       if(!icon[1].match(/^data\:([a-z\-\/]+)\;base64\,/))
  515.         continue;
  516.       var  type=RegExp.$1;
  517.       var stream=this.settings._ioService.newChannel(icon[1],null,null).open();
  518.       binStream.setInputStream(stream);
  519.       var array=binStream.readByteArray(stream.available());
  520.       this._ds.updateBookmarkIcon(icon[0],type,array,array.length);
  521.     }
  522.     return null;
  523.   },
  524.  
  525.   undo:function()
  526.   {
  527.     if(!this.settings.undoable)
  528.       return;
  529.     var merge=this.settings.getBool("merge",false);
  530.     var toolbar=this._rdfService.GetResource(this.settings.cacheToolbar);
  531.     this.settings.setBool("merge",false);
  532.     try{
  533.       this.settings.redoCache=this.source;
  534.       this.source=this.settings.undoCache;
  535.       this.settings.undoCache="";
  536.       if(this._ds.isBookmarkedResource(toolbar))
  537.         this._ds.setBookmarksToolbarFolder(toolbar);
  538.     }catch(e){alert(e);}
  539.     this.settings.setBool("merge",merge);
  540.   },
  541.  
  542.   redo:function()
  543.   {
  544.     if(!this.settings.redoable)
  545.       return;
  546.     var merge=this.settings.getBool("merge",false);
  547.     this.settings.setBool("merge",false);
  548.     try{
  549.       this.settings.undoCache=this.source;
  550.       this.source=this.settings.redoCache;
  551.       this.settings.redoCache="";
  552.     }catch(e){alert(e);}
  553.     this.settings.setBool("merge",merge);
  554.   },
  555.  
  556.   updateUndoCache:function()
  557.   {
  558.     if(!this.settings.getBool("session.enabled"))
  559.       return;
  560.     this.settings.cacheFolder=this.settings.selectedFolder;
  561.     this.settings.cacheToolbar=this._rdfToolbar.Value;
  562.     var merge=this.settings.getBool("merge",false);
  563.     this.settings.setBool("merge",false);
  564.     try{
  565.       this.settings.undoCache=this.source;
  566.       this.settings.redoCache="";
  567.     }catch(e){alert(e);}
  568.     this.settings.setBool("merge",merge);
  569.   },
  570.  
  571.   _subprocess:function()
  572.   {
  573.     var foldersets=[[this._tempDoc.documentElement,this._root]];
  574.     var folderset=null;
  575.  
  576.     const trueVal=this._rdfService.GetLiteral("true");
  577.  
  578.     while(foldersets.length > 0)
  579.     {
  580.       folderset=foldersets.shift();
  581.       var childNodes=folderset[0].childNodes;
  582.       var resource= folderset[1];
  583.       var title="";
  584.       var desc="";
  585.       var id="";
  586.       for(var i =0; i< childNodes.length; i++)
  587.       {
  588.         var element=childNodes[i];
  589.         if(element.nodeType==1)
  590.         {
  591.           id=this._getProp(element,"id");
  592.           switch(element.nodeName.toUpperCase())
  593.           {
  594.             case "BOOKMARK":
  595.               var data=this._getBookmarkData(element);
  596.               if(!data[5]){
  597.                 var bookmark = this._ds.createBookmarkInContainer(data[1],data[2],data[3],data[4],null,null,resource,0);
  598.                 if(data[6])
  599.                   this._ds.Assert(bookmark,this._sideArc,trueVal,true);
  600.               }
  601.               else
  602.                 this._ds.createLivemarkInContainer(data[1],data[2],data[5],data[4],resource,0);
  603.               break;
  604.             case "FOLDER":
  605.               title=this._getTitle(element);
  606.               desc=this._getDesc(element);
  607.               var newresource=this._ds.createFolderInContainer(title,resource,0);
  608.               if(desc)
  609.                 this._ds.Assert(newresource,this._descArc,this._rdfService.GetLiteral(desc),true);
  610.               foldersets.push([element,newresource]);
  611.               if(this._xbelToolbar && id==this._xbelToolbar)
  612.                 this._ds.setBookmarksToolbarFolder(newresource);
  613.               break;
  614.             case "SEPARATOR":
  615.               this._createSeparator(resource);
  616.               break;
  617.           }
  618.         }
  619.       }
  620.     }
  621.   },
  622.  
  623.   _createBookmark: function (aID,feedURL)
  624.   {
  625.     var bookmark=null;
  626.     if(aID) 
  627.       bookmark=this._rdfService.GetResource(aID);
  628.     if(!bookmark || this._ds.isBookmarkedResource(bookmark))
  629.       bookmark=this._rdfService.GetAnonymousResource();
  630.     if(feedURL){
  631.       var feed=this._rdfService.GetLiteral(feedURL);
  632.       this._assert(bookmark,this._typeArc,this._livemarkVal);
  633.       this._assert(bookmark,this._feedArc,feed);
  634.     }
  635.     else
  636.       this._assert(bookmark,this._typeArc,this._bookmarkVal);
  637.     this._tempc.AppendElement(bookmark);
  638.     return bookmark;
  639.   },
  640.  
  641.   get __xbelToolbar()
  642.   {
  643.     var metadata= this._getMetadata(this._getInfo(this._tempDoc.documentElement));
  644.     if(metadata)
  645.       return metadata.getAttribute("BookmarksToolbarFolder");
  646.     else
  647.       return null;
  648.   },
  649.  
  650.   _createSeparator: function (aParent)
  651.   {
  652.     var sep=this._ds.createSeparator();
  653.  
  654.     //Init Container with Parent Folder
  655.     if( ! aParent.EqualsString ( this._tempc.Resource.Value ) )
  656.       this._tempc.Init(this._ds,aParent);
  657.     this._tempc.AppendElement(sep);
  658.   },
  659.  
  660.   _getProp: function (aElement,aProp)
  661.   {
  662.     var value=aElement.getAttribute(aProp);
  663.     return (value)? value.replace(/\%3A/g,":") :"";
  664.   },
  665.  
  666.   _getBookmarkData:function(aElement)
  667.   {
  668.     /*0=id,1=name,2=url,3=keyword,4=desc,5=feedURL,6=webPanel*/
  669.     var data = [this._getProp(aElement,"id"),"",this._getProp(aElement,"href"),"","","",""];
  670.     var childNodes=aElement.childNodes;
  671.     for(var i =0; i< childNodes.length; i++)
  672.     {
  673.       var element=childNodes[i];
  674.       if(element.nodeType==1)
  675.       {
  676.         switch(element.nodeName.toUpperCase())
  677.         {
  678.           case "TITLE":
  679.             data[1]=this._getText(element);
  680.             break;
  681.           case "INFO":
  682.             var metadata=this._getMetadata(element);
  683.             if(metadata)
  684.             {
  685.               data[3]=metadata.getAttribute("ShortcutURL");
  686.               data[5]=metadata.getAttribute("FeedURL");
  687.               data[6]=metadata.getAttribute("WebPanel");
  688.               var icon=metadata.getAttribute("Icon");
  689.               if(icon)
  690.                 this._icons.push([data[2],icon]);
  691.             }
  692.             break;
  693.           case "DESC":
  694.             data[4]=this._getText(element);
  695.             break;
  696.         }
  697.       }
  698.     }
  699.     return data;
  700.   },
  701.  
  702.   _getTitle: function (aElement)
  703.   {
  704.     var title=aElement.firstChild;
  705.     while(title && title.nodeName.toUpperCase() != "TITLE")
  706.       title=title.nextSibling;
  707.     if(title)
  708.       return this._getText(title);
  709.     return "No Title";
  710.   },
  711.  
  712.   _getDesc: function (aElement)
  713.   {
  714.     var desc=aElement.firstChild;
  715.     while(desc && desc.nodeName.toUpperCase() != "DESC")
  716.       desc=desc.nextSibling;
  717.     if(desc)
  718.       return this._getText(desc);
  719.     return "";
  720.   },
  721.  
  722.   _getInfo: function (aXBEL)
  723.   {
  724.     var info=aXBEL.firstChild;
  725.     while(info && info.nodeName.toUpperCase() != "INFO")
  726.       info=info.nextSibling;
  727.     return info;
  728.   },
  729.  
  730.   _getMetadata: function (aInfo)
  731.   {
  732.     if(!aInfo)
  733.       return null;
  734.     var metadata=aInfo.firstChild;
  735.     while(metadata && (metadata.nodeName.toUpperCase() != "METADATA"
  736.                    || metadata.getAttribute("owner") != this._owner ))
  737.       metadata=metadata.nextSibling;
  738.     return metadata;
  739.   },
  740.  
  741.   _getText: function (element)
  742.   {
  743.     var str="";
  744.     try{
  745.       var textnodes=element.childNodes;
  746.       for(var i=0; i<textnodes.length ; i++)
  747.       {
  748.         var textnode=textnodes[0];
  749.         if(textnode.nodeType!=1)
  750.           str += textnode.nodeValue;
  751.       }
  752.     }catch(e){alert(e);}
  753.     return str;
  754.   },
  755.  
  756.   _isXBEL:function()
  757.   {
  758.     var rv=false;
  759.     try{
  760.       rv= (  this._tempDoc &&
  761.           typeof(this._tempDoc)=="object" &&
  762.           this._tempDoc.toString().match(/[object XMLDocument]/) &&
  763.           this._tempDoc.documentElement &&
  764.           this._tempDoc.documentElement.nodeName.toUpperCase() == "XBEL");
  765.       if(this.settings.getBool("publicid",true))
  766.         rv = rv && this._tempDoc.doctype && 
  767.             (this._tempDoc.doctype.publicId ==  this._pid);
  768.     }catch(e){ rv=false;}
  769.     return  rv;
  770.   },
  771.  
  772.   _unassert: function (aNode)
  773.   {
  774.     this.__unassert(this._ds,aNode);
  775.   },
  776.  
  777.   _assert: function (resource,arc,target)
  778.   {
  779.     this.__assert(this._ds,resource,arc,target);
  780.   },
  781.  
  782.   __assert: function (ds,resource,arc,target)
  783.   {
  784.     var oldtarget=ds.GetTarget(resource,arc,true);
  785.     if(oldtarget) ds.Change(resource,arc,oldtarget,target);
  786.     else ds.Assert(resource,arc,target,true);
  787.   },
  788.  
  789.   __unassert: function (ds,node)
  790.   {
  791.     var props=ds.ArcLabelsOut(node);
  792.     while(props.hasMoreElements())
  793.     {
  794.        var prop=props.getNext();
  795.       var target=ds.GetTarget(node,prop,true);
  796.       ds.Unassert(node,prop,target);
  797.     }
  798.   },
  799.  
  800.   _killBrowser:function()
  801.   {
  802.     var nsIWindowMediator = Components.classes['@mozilla.org/appshell/window-mediator;1']
  803.                   .getService(Components.interfaces.nsIWindowMediator);
  804.     var browserWindows=nsIWindowMediator.getZOrderDOMWindowEnumerator('navigator:browser',true);
  805.     while(browserWindows.hasMoreElements())
  806.     {
  807.       try{
  808.         var browserWindow=browserWindows.getNext();
  809.         browserWindow.QueryInterface(Components.interfaces.nsIDOMWindowInternal);
  810.         browserWindow.gBookmarksSynchronizerService.unregObserver();
  811.       }catch(e){alert(e)}
  812.     }
  813.   },
  814.  
  815.   _reliveBrowser:function()
  816.   {
  817.     var nsIWindowMediator = Components.classes['@mozilla.org/appshell/window-mediator;1']
  818.                   .getService(Components.interfaces.nsIWindowMediator);
  819.     var browserWindows=nsIWindowMediator.getZOrderDOMWindowEnumerator('navigator:browser',true);
  820.     while(browserWindows.hasMoreElements())
  821.     {
  822.       try{
  823.         var browserWindow=browserWindows.getNext();
  824.         browserWindow.QueryInterface(Components.interfaces.nsIDOMWindowInternal);
  825.         browserWindow.gBookmarksSynchronizerService.regObserver();
  826.       }catch(e){alert(e)}
  827.     }
  828.   },
  829.  
  830.   convertToUnicode: function ( aStr )
  831.   {
  832.     var charset="";
  833.     try{
  834.       var unicodeConverter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
  835.                     .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  836.       if(aStr.match(/encoding=\"(.+)\"/i))
  837.         charset=RegExp.$1;
  838.       unicodeConverter.charset = (charset)? charset:"UTF-8";
  839.       aStr=unicodeConverter.ConvertToUnicode( aStr );
  840.       if(charset && charset!="UTF\-16")
  841.         aStr=aStr.replace(charset,"UTF-16");
  842.     }catch(e){alert(e);}
  843.     return aStr;
  844.   }
  845. };
  846.